package eva.savant.business.ventas.view

import eva.savant.businessobject.mt.Material
import eva.savant.businessobject.vt.Canal
import eva.savant.businessobject.gl.Moneda
import eva.savant.businessobject.vt.Organizacion
import eva.savant.businessobject.vt.Precio
import org.primefaces.event.SelectEvent

import javax.faces.bean.ManagedBean
import javax.faces.bean.SessionScoped
import javax.annotation.PostConstruct

@SessionScoped
@ManagedBean(name = 'IMCanal')
public class IMCanal extends Bean {

  def XMaterialCod=''

  Precio detalle

  def lsMoneda, lsOrganizacion

  @PostConstruct
  public void cleanEntity() {

    focus= 'ps:materialId:valueId'

    entity= new Canal(); init()

    entity.moneda= new Moneda()

    entity.organizacion= new Organizacion()

    entity.lsPrecio= new ArrayList<Precio>()


    XMaterialCod= null

    detalle= new Precio()

    detalle.material= new Material()


    lsMoneda= entityService.find('select m from ' + Moneda.canonicalName + ' m where m.operacionId > 0')

    lsOrganizacion= find(Organizacion.class,'')
  }

  public List findLsEntity() {

    return find(entity.class, '')
  }

  public boolean mergeEntity(Object entity) { entity= (Canal) entity

    for(p in entity.lsPrecio) {

    p.canal= entity

    p.operacionId= ALTA

    p.sociedadId= sociedad.id

    p.usuarioId= usuario.id  }


    return merge(entity) != null
  }

  public void editEntity(Object id) {

    entity= get(entity.class, id)
  }

  public void removeEntity(Object entity) {

    remove(entity)
  }

  public void XMaterialFind() {

    detalle.material= get(Material.class,'rapido=?',toInteger(XMaterialCod))

    if(detalle.material == null) detalle.material= get(Material.class, sociedad.id + XMaterialCod)

    if(detalle.material == null) detalle.material= get(Material.class,'barras=?', XMaterialCod)

    if(detalle.material != null) XMaterialSelect()
  }

  public void XMaterialSelect() {

    focus= 'ps:precioId:input'

    XMaterialCod= detalle.material.codigo

    def p= get(Precio.class,'canal.id=? and material.id=?',entity.id,detalle.material.id)

    detalle.precio   = p?.precio    > 0? p.precio    : 0

    detalle.impuesto = p?.impuesto  > 0? p.impuesto  : 0

    detalle.descuento= p?.descuento > 0? p.descuento : 0
  }

  public void detailAdd() {

    if(!(detalle.precio > 0)) { addErrorMessage 'El precio del producto debe ser mayor a cero' }


    def p= new Precio()

    p.material= detalle.material

    p.precio= detalle.precio

    p.impuesto= detalle.impuesto

    p.descuento= detalle.descuento


    detailDelete(p)

    entity.lsPrecio.add(p)


    detalle= new Precio()

    detalle.material= new Material()

    XMaterialCod= ''

    focus= 'ps:materialId:valueId'
  }

  public void detailEdit(SelectEvent event) {

    if(isRead) return

    def p= (Precio) event.object

    detalle          = new Precio()

    detalle.material = p.material

    detalle.precio   = p.precio

    detalle.impuesto = p.impuesto

    detalle.descuento= p.descuento

    XMaterialCod     = p.material.codigo
  }

  public void detailDelete(Precio precio) {

    for(int i=0; i < entity.lsPrecio.size(); i++)  { def p= entity.lsPrecio.get(i)

    if(p.material.id.equalsIgnoreCase(precio.material.id)) { entity.lsPrecio.remove(i); break } }
  }

  def getXMaterialConverter() { return converterLike(Material.class) }

  def XMaterialComplete(String value) { return completeLike(Material.class,'nombre',value) }

}
